From: Jonathan Dieter Date: Tue, 24 Jul 2018 21:28:57 +0000 (+0100) Subject: Revamp error handling so it actually works X-Git-Tag: archive/raspbian/1.1.9+ds1-1+rpi1~1^2~186 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=219932f211258826f02a0aee5312a9b480b4d20b;p=zchunk.git Revamp error handling so it actually works Signed-off-by: Jonathan Dieter --- diff --git a/src/lib/error.c b/src/lib/error.c index baa4fc5..5017e17 100644 --- a/src/lib/error.c +++ b/src/lib/error.c @@ -32,33 +32,62 @@ #include "zck_private.h" -char *snprintf_error = "String conversion error"; +char *snprintf_error = "Unknown error"; -void set_error_wf(zckCtx *zck, int fatal, const char *format, ...) { +void set_error_wf(zckCtx *zck, int fatal, const char *function, + const char *format, ...) { va_list args; int size = 0; - assert(zck != NULL && zck->msg == NULL && format != NULL); - zck->error_state = 1 + (fatal > 0 ? 1 : 0); + char *old_msg = NULL; + int old_size = 0; + assert(zck != NULL && format != NULL); + + zck->error_state = 1 + (fatal > 0 ? 1 : 0); va_start(args, format); size = vsnprintf(NULL, 0, format, args); + va_end(args); + va_start(args, format); + zck_log_v(function, ZCK_LOG_ERROR, format, args); + va_end(args); if(size < 0) return; - zck->msg = zmalloc(size+1); - vsnprintf(zck->msg, size+1, format, args); + if(zck->msg != NULL) { + old_size = strlen(zck->msg); + old_msg = zck->msg; + } + if(old_msg) + zck->msg = zmalloc(size + old_size + 3); + else + zck->msg = zmalloc(size + 2); + va_start(args, format); + vsnprintf(zck->msg, size + 1, format, args); va_end(args); + if(old_msg) { + snprintf(zck->msg + size, old_size + 3, ": %s", old_msg); + free(old_msg); + } else { + snprintf(zck->msg + size, 2, "\n"); + } + +} + +int PUBLIC zck_is_error(zckCtx *zck) { + if(zck == NULL) + return 1; + + return zck->error_state; } char PUBLIC *zck_get_error(zckCtx *zck) { - assert(zck != NULL); + if(zck == NULL) + return "zckCtx is NULL\n"; return zck->msg; } int PUBLIC zck_clear_error(zckCtx *zck) { - assert(zck != NULL); - - if(zck->error_state > 1) + if(zck == NULL || zck->error_state > 1) return False; free(zck->msg); diff --git a/src/lib/log.c b/src/lib/log.c index 61195ca..5ccf0b6 100644 --- a/src/lib/log.c +++ b/src/lib/log.c @@ -43,12 +43,19 @@ void PUBLIC zck_set_log_fd(int fd) { log_fd = fd; } +void zck_log_v(const char *function, zck_log_type lt, const char *format, + va_list args) { + if(lt < log_level) + return; + + dprintf(log_fd, "%s: ", function); + vdprintf(log_fd, format, args); + dprintf(log_fd, "\n"); +} + void zck_log_wf(const char *function, zck_log_type lt, const char *format, ...) { - if(lt >= log_level) { - va_list args; - va_start(args, format); - dprintf(log_fd, "%s: ", function); - vdprintf(log_fd, format, args); - va_end(args); - } + va_list args; + va_start(args, format); + zck_log_v(function, lt, format, args); + va_end(args); }